#!/usr/bin/python
# -*- coding: utf-8 -*-

# Модуль обновляет EN-списки стран, регионов и доменов в БД. Для каждого домена выделяет его город и пытается определить координаты города.
# Сохраняет города (+их координаты) в таблице em_cities 

from DbShell import Db
import time, Loader

db = Db()

def storeCountries(countries):
    cdate = time.strftime("%Y-%m-%d %H:%M:%S")
    for c in countries:
        q = "INSERT INTO en_countries (`country_id`,`country_name`,`added`) VALUES (%s,'%s','%s')" % (c[2],c[1],cdate)
        res = db.query(q) # Если страны нет в БД, она добавится, иначе возникнет исключение
        if(res == 1062 or res ==0): # Если ошибка дублирования записи: такой элемент уже есть в БД
            pass
        else:
            print "while adding EN_COUNTRY MySQL report an ERROR № %d" % (res,)

def storeCity(city_name, countryId):
    #print city_name
    q = 'SELECT lat, lng FROM geo_db WHERE geoname = %s'
    res = db.query(q, (city_name,))
    lat, lng = 0, 0
    if res == 0:
        dataset = db.fetchall()
        if len(dataset) != 0:
            #print dataset
            (lat, lng) = dataset[0]
            #print lat, lng

    if lat != 0 and lng !=0:
        q = "INSERT INTO en_cities (`city_name`,`country_id`,`lat`,`lng`) VALUES (%s,%s,%s,%s)"
        res = db.query(q, (city_name, countryId, lat, lng)) # Если такого домена нет в БД, он добавится, иначе метод вернет не 0-й результат
    else:
        q = "INSERT INTO en_cities (`city_name`,`country_id`) VALUES (%s,%s)"
        res = db.query(q, (city_name, countryId)) # Если такого домена нет в БД, он добавится, иначе метод вернет не 0-й результат

    if res == 1062 and lat != 0 and lng != 0:
        q = 'UPDATE en_cities SET lat = %s, lng = %s WHERE city_name = %s'
        db.query(q, (lat,lng, city_name))
    elif res == 0:
        print "added new city: %s" % (city_name, )

def storeDomains(domains,countryId,regionId):
    cdate = time.strftime("%Y-%m-%d %H:%M:%S")
    for c in domains:
        c[2] = c[2].replace('-','0')
        c[3] = c[3].replace('-','0')
        c[4] = c[4].replace('-','0')
        q = "INSERT INTO en_domains (`domain_name`,`city_name`,`country_id`,`owner_id`,`owner_name`,`games_played`,`players`,`teams`,`added`)\
            VALUES ('%s','%s',%s,%s,'%s',%s,%s,%s,'%s')" % (c[0],c[1],countryId,c[5],c[6],c[2],c[4],c[3],cdate)
        res = db.query(q) # Если такого домена нет в БД, он добавится, иначе метод вернет не 0-й результат
        if(res == 1062 or res ==0): # Если ошибка дублирования записи: такой элемент уже есть в БД
            storeCity(c[1], countryId)
        else:
            print "while adding EN_DOMAIN '%s' MySQL report an ERROR № %d" % (c[0],res)
            print c
            print q

def storeRegions(countryId, regions):
    cdate = time.strftime("%Y-%m-%d %H:%M:%S")
    for item in regions:
        item[2] = item[2].replace('-','0')
        item[3] = item[3].replace('-','0')
        item[4] = item[4].replace('-','0')
        q = "INSERT INTO en_regions (`region_id`,`country_id`,`region_name`,`games_played`,`players`,`teams`,`added`)\
            VALUES (%s,%s,'%s',%s,%s,%s,'%s')" % (item[5],countryId,item[0],item[2],item[4],item[3],cdate)
        res = db.query(q) # Если страны нет в БД, она добавится, иначе возникнет исключение
        if(res == 1062 or res ==0): # Ошибка Дублирования записи: такой элемент уже есть в БД
            pass
        else:
            print "while adding EN_REGION MySQL report an ERROR № %d" % (res,)
            
#--- Код модуля --------------------------------------------------------------
log = "STARTED at %s\n" % (time.strftime("%Y-%m-%d %H:%M:%S"), )
try:
	countries = Loader.getCountriesList()   # Получим список стран с сайта ЕН
	storeCountries(countries)               # Сохраним список стран в БД

	for (nil, cname, countryId) in countries:     # Для каждой страны получим список регионов
		regionsDomains = Loader.getRegions(countryId)
		#print len(regionsDomains)
		#print regionsDomains
		if regionsDomains[0] == 'r':
			storeRegions(countryId, regionsDomains[1])        # Сохраняем список регионов
			log = log + "regions of %s saved \n" % (cname,)
			for region in regionsDomains[1]:  # Для каждого региона, получаем список доменов
				regionId = region[5]
				domains = Loader.getDomainsList(countryId, regionId)
				storeDomains(domains,countryId, regionId) # Сохраним список доменов в БД
				log = log + "domains of '%s' in '%s' saved\n" % (region[0],cname)
		elif regionsDomains[0] == 'd':
			storeDomains(regionsDomains[1], countryId, -1)
			log = log + "domains of '%s' saved\n" % (cname,)

	log = log + "FINISHED at %s\n" % (time.strftime("%Y-%m-%d %H:%M:%S"), )
except Exception,e:
	print "\n\n Exception raiesed:\n"
	print e, "\n\n Debug log:\n"
	print log